package com.ljx.LRU;

import java.util.LinkedHashMap;

/**
 * @author 李加喜
 * @Package com.ljx.LRU
 * @date 2021-12-13 9:02
 */
public class LRUCache {
    int cap;
    LinkedHashMap<Integer,Integer> cache= new LinkedHashMap<Integer,Integer>();

    public LRUCache(int capacity) {
        this.cap=capacity;
    }

    public int get(int key) {
        if (!cache.containsKey(key)){
            return -1;
        }
        //将当前节点设置为最近使用的
        makeRecently(key);
        return cache.get(key);
    }

    public void put(int key, int value) {
        //如果key对应的数据如果存在的话  就直接进行修改  并且将这个值设置为最近使用的
        if (cache.containsKey(key)){
            //直接修改值
            cache.put(key,value);
            makeRecently(key);
            return;
        }
        if (cache.size()>=this.cap){
            //获取链表的头部数据
            Integer oldestKey = cache.keySet().iterator().next();
            cache.remove(oldestKey);
        }
        //将最新的数据保存在key里面
        cache.put(key,value);
        // 如果不存在  判断是否已经达到最大量了  如果达到了  就需要将表头的数据删除  斗则直接查询到表尾就可以了
    }
    private void makeRecently(int key) {
        int val = cache.get(key);
        // 删除 key，重新插⼊到队尾
        cache.remove(key);
        cache.put(key, val);
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */
